package top.malegod.utils;

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Created on 17/6/7.
 * 短信API产品的DEMO程序,工程中包含了一个SmsDemo类，直接通过
 * 执行main函数即可体验短信产品API功能(只需要将AK替换成开通了云通信-短信产品功能的AK即可)
 * 工程依赖了2个jar包(存放在工程的libs目录下)
 * 1:aliyun-java-sdk-core.jar
 * 2:aliyun-java-sdk-dysmsapi.jar
 *
 * 备注:Demo工程编码采用UTF-8
 * 国际短信发送请勿参照此DEMO
 * @author AbelEthan
 */
public class SendMessageUtils {

  /**
   * 产品名称:云通信短信API产品,开发者无需替换
   */
  private static final String PRODUCT = "Dysmsapi";
  /**
   * 产品域名,开发者无需替换
   */
  private static final String DOMAIN = "dysmsapi.aliyuncs.com";
  /**
   * 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
   */
  private static final String ACCESS_KEY_ID = "LTAIx8HYGEYQ2Euj";
  private static final String ACCESS_KEY_SECRET = "IbJHGO2AoydMhVYtyAyFH72AT9ZiWI";

  private static final String CODE_OK = "OK";

  private static Logger logger = LoggerFactory.getLogger(SendMessageUtils.class);

  public static QuerySendDetailsResponse querySendDetails(String bizId) throws ClientException {

    //可自助调整超时时间
    System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
    System.setProperty("sun.net.client.defaultReadTimeout", "10000");

    //初始化acsClient,暂不支持region化
    IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", ACCESS_KEY_ID,
        ACCESS_KEY_SECRET);
    DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", PRODUCT, DOMAIN);
    IAcsClient acsClient = new DefaultAcsClient(profile);

    //组装请求对象
    QuerySendDetailsRequest request = new QuerySendDetailsRequest();
    //必填-号码
    request.setPhoneNumber("15356270096");
    //可选-流水号
    request.setBizId(bizId);
    //必填-发送日期 支持30天内记录查询，格式yyyyMMdd
    SimpleDateFormat ft = new SimpleDateFormat("yyyyMMdd");
    request.setSendDate(ft.format(new Date()));
    //必填-页大小
    request.setPageSize(10L);
    //必填-当前页码从1开始计数
    request.setCurrentPage(1L);

    //hint 此处可能会抛出异常，注意catch
    return acsClient.getAcsResponse(request);
  }


  public static void sendCode(String phone, String code)
      throws ClientException, InterruptedException {

    //可自助调整超时时间
    System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
    System.setProperty("sun.net.client.defaultReadTimeout", "10000");

    //初始化acsClient,暂不支持region化
    IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", ACCESS_KEY_ID,
        ACCESS_KEY_SECRET);
    DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", PRODUCT, DOMAIN);
    IAcsClient acsClient = new DefaultAcsClient(profile);

    //组装请求对象-具体描述见控制台-文档部分内容
    SendSmsRequest request = new SendSmsRequest();
    //必填:待发送手机号
    request.setPhoneNumbers(phone);
    //必填:短信签名-可在短信控制台中找到
    request.setSignName("顺路送");
    //必填:短信模板-可在短信控制台中找到
    request.setTemplateCode("SMS_135029608");
    //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
    request.setTemplateParam("{'code':" + code +"}");

    /*选填-上行短信扩展码(无特殊需求用户请忽略此字段)
    request.setSmsUpExtendCode("90997");*/

    //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
    request.setOutId(phone);

    //hint 此处可能会抛出异常，注意catch
    SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
    receiptInfo(sendSmsResponse);

  }

  public static void receiptInfo(SendSmsResponse sendSmsResponse) throws ClientException, InterruptedException {

    logger.info("短信接口返回的数据----------------");
    logger.info("Code=" + sendSmsResponse.getCode());
    logger.info("Message=" + sendSmsResponse.getMessage());
    logger.info("RequestId=" + sendSmsResponse.getRequestId());
    logger.info("BizId=" + sendSmsResponse.getBizId());

    Thread.sleep(3000L);
    //查明细
    if(sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals(CODE_OK)) {
      QuerySendDetailsResponse querySendDetailsResponse = querySendDetails(sendSmsResponse.getBizId());
      logger.info("短信明细查询接口返回数据----------------");
      logger.info("Code=" + querySendDetailsResponse.getCode());
      logger.info("Message=" + querySendDetailsResponse.getMessage());
      int i = 0;
      for(QuerySendDetailsResponse.SmsSendDetailDTO smsSendDetailDTO : querySendDetailsResponse.getSmsSendDetailDTOs())
      {
        logger.info("SmsSendDetailDTO["+i+"]:");
        logger.info("Content=" + smsSendDetailDTO.getContent());
        logger.info("ErrCode=" + smsSendDetailDTO.getErrCode());
        logger.info("OutId=" + smsSendDetailDTO.getOutId());
        logger.info("PhoneNum=" + smsSendDetailDTO.getPhoneNum());
        logger.info("ReceiveDate=" + smsSendDetailDTO.getReceiveDate());
        logger.info("SendDate=" + smsSendDetailDTO.getSendDate());
        logger.info("SendStatus=" + smsSendDetailDTO.getSendStatus());
        logger.info("Template=" + smsSendDetailDTO.getTemplateCode());
      }
      logger.info("TotalCount=" + querySendDetailsResponse.getTotalCount());
      logger.info("RequestId=" + querySendDetailsResponse.getRequestId());
    }
  }
}
